home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / perl / 5.10.0 / CORE / thread.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-06-26  |  12.0 KB  |  475 lines

  1. /*    thread.h
  2.  *
  3.  *    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
  4.  *    by Larry Wall and others
  5.  *
  6.  *    You may distribute under the terms of either the GNU General Public
  7.  *    License or the Artistic License, as specified in the README file.
  8.  *
  9.  */
  10.  
  11. #if defined(USE_ITHREADS)
  12.  
  13. #if defined(VMS)
  14. #include <builtins.h>
  15. #endif
  16.  
  17. #ifdef WIN32
  18. #  include <win32thread.h>
  19. #else
  20. #ifdef NETWARE
  21. #  include <nw5thread.h>
  22. #else
  23. #  ifdef OLD_PTHREADS_API /* Here be dragons. */
  24. #    define DETACH(t) \
  25.     STMT_START {                        \
  26.     int _eC_;                        \
  27.     if ((_eC_ = pthread_detach(&(t)->self))) {        \
  28.         MUTEX_UNLOCK(&(t)->mutex);                \
  29.         Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]",    \
  30.                  _eC_, __FILE__, __LINE__);    \
  31.     }                            \
  32.     } STMT_END
  33.  
  34. #    define PERL_GET_CONTEXT    Perl_get_context()
  35. #    define PERL_SET_CONTEXT(t)    Perl_set_context((void*)t)
  36.  
  37. #    define PTHREAD_GETSPECIFIC_INT
  38. #    ifdef DJGPP
  39. #      define pthread_addr_t any_t
  40. #      define NEED_PTHREAD_INIT
  41. #      define PTHREAD_CREATE_JOINABLE (1)
  42. #    endif
  43. #    ifdef __OPEN_VM
  44. #      define pthread_addr_t void *
  45. #    endif
  46. #    ifdef OEMVS
  47. #      define pthread_addr_t void *
  48. #      define pthread_create(t,a,s,d)        pthread_create(t,&(a),s,d)
  49. #      define pthread_keycreate              pthread_key_create
  50. #    endif
  51. #    ifdef VMS
  52. #      define pthread_attr_init(a) pthread_attr_create(a)
  53. #      define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s)
  54. #      define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
  55. #      define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
  56. #      define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
  57. #      define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
  58. #    endif
  59. #    if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
  60. #      define pthread_attr_init(a) pthread_attr_create(a)
  61.        /* XXX pthread_setdetach_np() missing in DCE threads on HP-UX 10.20 */
  62. #      define PTHREAD_ATTR_SETDETACHSTATE(a,s)    (0)
  63. #      define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
  64. #      define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
  65. #      define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
  66. #      define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
  67. #    endif
  68. #    if defined(DJGPP) || defined(__OPEN_VM) || defined(OEMVS)
  69. #      define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s))
  70. #      define YIELD pthread_yield(NULL)
  71. #    endif
  72. #  endif
  73. #  if !defined(__hpux) || !defined(__ux_version) || __ux_version > 1020
  74. #    define pthread_mutexattr_default NULL
  75. #    define pthread_condattr_default  NULL
  76. #  endif
  77. #endif    /* NETWARE */
  78. #endif
  79.  
  80. #ifndef PTHREAD_CREATE
  81. /* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */
  82. #  define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d)
  83. #endif
  84.  
  85. #ifndef PTHREAD_ATTR_SETDETACHSTATE
  86. #  define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
  87. #endif
  88.  
  89. #ifndef PTHREAD_CREATE_JOINABLE
  90. #  ifdef OLD_PTHREAD_CREATE_JOINABLE
  91. #    define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE
  92. #  else
  93. #    define PTHREAD_CREATE_JOINABLE 0 /* Panic?  No, guess. */
  94. #  endif
  95. #endif
  96.  
  97. #ifdef DGUX
  98. #  define THREAD_CREATE_NEEDS_STACK (32*1024)
  99. #endif
  100.  
  101. #ifdef __VMS
  102.   /* Default is 1024 on VAX, 8192 otherwise */
  103. #  define THREAD_CREATE_NEEDS_STACK (32*1024)
  104. #endif
  105.  
  106. #ifdef I_MACH_CTHREADS
  107.  
  108. /* cthreads interface */
  109.  
  110. /* #include <mach/cthreads.h> is in perl.h #ifdef I_MACH_CTHREADS */
  111.  
  112. #define MUTEX_INIT(m) \
  113.     STMT_START {                        \
  114.     *m = mutex_alloc();                    \
  115.     if (*m) {                        \
  116.         mutex_init(*m);                    \
  117.     } else {                        \
  118.         Perl_croak_nocontext("panic: MUTEX_INIT [%s:%d]",    \
  119.                  __FILE__, __LINE__);        \
  120.     }                            \
  121.     } STMT_END
  122.  
  123. #define MUTEX_LOCK(m)            mutex_lock(*m)
  124. #define MUTEX_UNLOCK(m)            mutex_unlock(*m)
  125. #define MUTEX_DESTROY(m) \
  126.     STMT_START {                        \
  127.     mutex_free(*m);                        \
  128.     *m = 0;                            \
  129.     } STMT_END
  130.  
  131. #define COND_INIT(c) \
  132.     STMT_START {                        \
  133.     *c = condition_alloc();                    \
  134.     if (*c) {                        \
  135.         condition_init(*c);                    \
  136.     }                            \
  137.     else {                            \
  138.         Perl_croak_nocontext("panic: COND_INIT [%s:%d]",    \
  139.                  __FILE__, __LINE__);        \
  140.     }                            \
  141.     } STMT_END
  142.  
  143. #define COND_SIGNAL(c)        condition_signal(*c)
  144. #define COND_BROADCAST(c)    condition_broadcast(*c)
  145. #define COND_WAIT(c, m)        condition_wait(*c, *m)
  146. #define COND_DESTROY(c) \
  147.     STMT_START {                        \
  148.     condition_free(*c);                    \
  149.     *c = 0;                            \
  150.     } STMT_END
  151.  
  152. #define THREAD_CREATE(thr, f)    (thr->self = cthread_fork(f, thr), 0)
  153. #define THREAD_POST_CREATE(thr)
  154.  
  155. #define THREAD_RET_TYPE        any_t
  156. #define THREAD_RET_CAST(x)    ((any_t) x)
  157.  
  158. #define DETACH(t)        cthread_detach(t->self)
  159. #define JOIN(t, avp)        (*(avp) = (AV *)cthread_join(t->self))
  160.  
  161. #define PERL_SET_CONTEXT(t)    cthread_set_data(cthread_self(), t)
  162. #define PERL_GET_CONTEXT    cthread_data(cthread_self())
  163.  
  164. #define INIT_THREADS        cthread_init()
  165. #define YIELD            cthread_yield()
  166. #define ALLOC_THREAD_KEY    NOOP
  167. #define FREE_THREAD_KEY        NOOP
  168. #define SET_THREAD_SELF(thr)    (thr->self = cthread_self())
  169.  
  170. #endif /* I_MACH_CTHREADS */
  171.  
  172. #ifndef YIELD
  173. #  ifdef SCHED_YIELD
  174. #    define YIELD SCHED_YIELD
  175. #  else
  176. #    ifdef HAS_SCHED_YIELD
  177. #      define YIELD sched_yield()
  178. #    else
  179. #      ifdef HAS_PTHREAD_YIELD
  180.     /* pthread_yield(NULL) platforms are expected
  181.      * to have #defined YIELD for themselves. */
  182. #        define YIELD pthread_yield()
  183. #      endif
  184. #    endif
  185. #  endif
  186. #endif
  187.  
  188. #ifdef __hpux
  189. #  define MUTEX_INIT_NEEDS_MUTEX_ZEROED
  190. #endif
  191.  
  192. #ifndef MUTEX_INIT
  193.  
  194. #  ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
  195.     /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
  196. #    define MUTEX_INIT(m) \
  197.     STMT_START {                        \
  198.     int _eC_;                        \
  199.     Zero((m), 1, perl_mutex);                               \
  200.      if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))    \
  201.         Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",    \
  202.                  _eC_, __FILE__, __LINE__);    \
  203.     } STMT_END
  204. #  else
  205. #    define MUTEX_INIT(m) \
  206.     STMT_START {                        \
  207.     int _eC_;                        \
  208.     if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))    \
  209.         Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",    \
  210.                  _eC_, __FILE__, __LINE__);    \
  211.     } STMT_END
  212. #  endif
  213.  
  214. #  define MUTEX_LOCK(m) \
  215.     STMT_START {                        \
  216.     int _eC_;                        \
  217.     if ((_eC_ = pthread_mutex_lock((m))))            \
  218.         Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",    \
  219.                  _eC_, __FILE__, __LINE__);    \
  220.     } STMT_END
  221.  
  222. #  define MUTEX_UNLOCK(m) \
  223.     STMT_START {                        \
  224.     int _eC_;                        \
  225.     if ((_eC_ = pthread_mutex_unlock((m))))            \
  226.         Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]",    \
  227.                  _eC_, __FILE__, __LINE__);    \
  228.     } STMT_END
  229.  
  230. #  define MUTEX_DESTROY(m) \
  231.     STMT_START {                        \
  232.     int _eC_;                        \
  233.     if ((_eC_ = pthread_mutex_destroy((m))))        \
  234.         Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]",    \
  235.                  _eC_, __FILE__, __LINE__);    \
  236.     } STMT_END
  237. #endif /* MUTEX_INIT */
  238.  
  239. #ifndef COND_INIT
  240. #  define COND_INIT(c) \
  241.     STMT_START {                        \
  242.     int _eC_;                        \
  243.     if ((_eC_ = pthread_cond_init((c), pthread_condattr_default)))    \
  244.         Perl_croak_nocontext("panic: COND_INIT (%d) [%s:%d]",    \
  245.                  _eC_, __FILE__, __LINE__);    \
  246.     } STMT_END
  247.  
  248. #  define COND_SIGNAL(c) \
  249.     STMT_START {                        \
  250.     int _eC_;                        \
  251.     if ((_eC_ = pthread_cond_signal((c))))            \
  252.         Perl_croak_nocontext("panic: COND_SIGNAL (%d) [%s:%d]",    \
  253.                  _eC_, __FILE__, __LINE__);    \
  254.     } STMT_END
  255.  
  256. #  define COND_BROADCAST(c) \
  257.     STMT_START {                        \
  258.     int _eC_;                        \
  259.     if ((_eC_ = pthread_cond_broadcast((c))))        \
  260.         Perl_croak_nocontext("panic: COND_BROADCAST (%d) [%s:%d]",    \
  261.                  _eC_, __FILE__, __LINE__);    \
  262.     } STMT_END
  263.  
  264. #  define COND_WAIT(c, m) \
  265.     STMT_START {                        \
  266.     int _eC_;                        \
  267.     if ((_eC_ = pthread_cond_wait((c), (m))))        \
  268.         Perl_croak_nocontext("panic: COND_WAIT (%d) [%s:%d]",    \
  269.                  _eC_, __FILE__, __LINE__);    \
  270.     } STMT_END
  271.  
  272. #  define COND_DESTROY(c) \
  273.     STMT_START {                        \
  274.     int _eC_;                        \
  275.     if ((_eC_ = pthread_cond_destroy((c))))            \
  276.         Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]",    \
  277.                  _eC_, __FILE__, __LINE__);    \
  278.     } STMT_END
  279. #endif /* COND_INIT */
  280.  
  281. /* DETACH(t) must only be called while holding t->mutex */
  282. #ifndef DETACH
  283. #  define DETACH(t) \
  284.     STMT_START {                        \
  285.     int _eC_;                        \
  286.     if ((_eC_ = pthread_detach((t)->self))) {        \
  287.         MUTEX_UNLOCK(&(t)->mutex);                \
  288.         Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]",    \
  289.                  _eC_, __FILE__, __LINE__);    \
  290.     }                            \
  291.     } STMT_END
  292. #endif /* DETACH */
  293.  
  294. #ifndef JOIN
  295. #  define JOIN(t, avp) \
  296.     STMT_START {                        \
  297.     int _eC_;                        \
  298.     if ((_eC_ = pthread_join((t)->self, (void**)(avp))))    \
  299.         Perl_croak_nocontext("panic: pthread_join (%d) [%s:%d]",    \
  300.                  _eC_, __FILE__, __LINE__);    \
  301.     } STMT_END
  302. #endif /* JOIN */
  303.  
  304. /* Use an unchecked fetch of thread-specific data instead of a checked one.
  305.  * It would fail if the key were bogus, but if the key were bogus then
  306.  * Really Bad Things would be happening anyway. --dan */
  307. #if (defined(__ALPHA) && (__VMS_VER >= 70000000)) || \
  308.     (defined(__alpha) && defined(__osf__) && !defined(__GNUC__)) /* Available only on >= 4.0 */
  309. #  define HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP /* Configure test needed */
  310. #endif
  311.  
  312. #ifdef HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP
  313. #  define PTHREAD_GETSPECIFIC(key) pthread_unchecked_getspecific_np(key)
  314. #else
  315. #    define PTHREAD_GETSPECIFIC(key) pthread_getspecific(key)
  316. #endif
  317.  
  318. #ifndef PERL_GET_CONTEXT
  319. #  define PERL_GET_CONTEXT    PTHREAD_GETSPECIFIC(PL_thr_key)
  320. #endif
  321.  
  322. #ifndef PERL_SET_CONTEXT
  323. #  define PERL_SET_CONTEXT(t) \
  324.     STMT_START {                        \
  325.     int _eC_;                        \
  326.     if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t))))    \
  327.         Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]",    \
  328.                  _eC_, __FILE__, __LINE__);    \
  329.     } STMT_END
  330. #endif /* PERL_SET_CONTEXT */
  331.  
  332. #ifndef INIT_THREADS
  333. #  ifdef NEED_PTHREAD_INIT
  334. #    define INIT_THREADS pthread_init()
  335. #  endif
  336. #endif
  337.  
  338. #ifndef ALLOC_THREAD_KEY
  339. #  define ALLOC_THREAD_KEY \
  340.     STMT_START {                        \
  341.     if (pthread_key_create(&PL_thr_key, 0)) {        \
  342.             write(2, STR_WITH_LEN("panic: pthread_key_create failed\n")); \
  343.         exit(1);                        \
  344.     }                            \
  345.     } STMT_END
  346. #endif
  347.  
  348. #ifndef FREE_THREAD_KEY
  349. #  define FREE_THREAD_KEY \
  350.     STMT_START {                        \
  351.     pthread_key_delete(PL_thr_key);                \
  352.     } STMT_END
  353. #endif
  354.  
  355. #ifndef PTHREAD_ATFORK
  356. #  ifdef HAS_PTHREAD_ATFORK
  357. #    define PTHREAD_ATFORK(prepare,parent,child)        \
  358.     pthread_atfork(prepare,parent,child)
  359. #  else
  360. #    define PTHREAD_ATFORK(prepare,parent,child)        \
  361.     NOOP
  362. #  endif
  363. #endif
  364.  
  365. #ifndef THREAD_RET_TYPE
  366. #  define THREAD_RET_TYPE    void *
  367. #  define THREAD_RET_CAST(p)    ((void *)(p))
  368. #endif /* THREAD_RET */
  369.  
  370. #  define LOCK_DOLLARZERO_MUTEX        MUTEX_LOCK(&PL_dollarzero_mutex)
  371. #  define UNLOCK_DOLLARZERO_MUTEX    MUTEX_UNLOCK(&PL_dollarzero_mutex)
  372.  
  373. #endif /* USE_ITHREADS */
  374.  
  375. #ifndef MUTEX_LOCK
  376. #  define MUTEX_LOCK(m)
  377. #endif
  378.  
  379. #ifndef MUTEX_UNLOCK
  380. #  define MUTEX_UNLOCK(m)
  381. #endif
  382.  
  383. #ifndef MUTEX_INIT
  384. #  define MUTEX_INIT(m)
  385. #endif
  386.  
  387. #ifndef MUTEX_DESTROY
  388. #  define MUTEX_DESTROY(m)
  389. #endif
  390.  
  391. #ifndef COND_INIT
  392. #  define COND_INIT(c)
  393. #endif
  394.  
  395. #ifndef COND_SIGNAL
  396. #  define COND_SIGNAL(c)
  397. #endif
  398.  
  399. #ifndef COND_BROADCAST
  400. #  define COND_BROADCAST(c)
  401. #endif
  402.  
  403. #ifndef COND_WAIT
  404. #  define COND_WAIT(c, m)
  405. #endif
  406.  
  407. #ifndef COND_DESTROY
  408. #  define COND_DESTROY(c)
  409. #endif
  410.  
  411. #ifndef LOCK_SV_MUTEX
  412. #  define LOCK_SV_MUTEX
  413. #endif
  414.  
  415. #ifndef UNLOCK_SV_MUTEX
  416. #  define UNLOCK_SV_MUTEX
  417. #endif
  418.  
  419. #ifndef LOCK_STRTAB_MUTEX
  420. #  define LOCK_STRTAB_MUTEX
  421. #endif
  422.  
  423. #ifndef UNLOCK_STRTAB_MUTEX
  424. #  define UNLOCK_STRTAB_MUTEX
  425. #endif
  426.  
  427. #ifndef LOCK_CRED_MUTEX
  428. #  define LOCK_CRED_MUTEX
  429. #endif
  430.  
  431. #ifndef UNLOCK_CRED_MUTEX
  432. #  define UNLOCK_CRED_MUTEX
  433. #endif
  434.  
  435. #ifndef LOCK_FDPID_MUTEX
  436. #  define LOCK_FDPID_MUTEX
  437. #endif
  438.  
  439. #ifndef UNLOCK_FDPID_MUTEX
  440. #  define UNLOCK_FDPID_MUTEX
  441. #endif
  442.  
  443. #ifndef LOCK_SV_LOCK_MUTEX
  444. #  define LOCK_SV_LOCK_MUTEX
  445. #endif
  446.  
  447. #ifndef UNLOCK_SV_LOCK_MUTEX
  448. #  define UNLOCK_SV_LOCK_MUTEX
  449. #endif
  450.  
  451. #ifndef LOCK_DOLLARZERO_MUTEX
  452. #  define LOCK_DOLLARZERO_MUTEX
  453. #endif
  454.  
  455. #ifndef UNLOCK_DOLLARZERO_MUTEX
  456. #  define UNLOCK_DOLLARZERO_MUTEX
  457. #endif
  458.  
  459. /* THR, SET_THR, and dTHR are there for compatibility with old versions */
  460. #ifndef THR
  461. #  define THR        PERL_GET_THX
  462. #endif
  463.  
  464. #ifndef SET_THR
  465. #  define SET_THR(t)    PERL_SET_THX(t)
  466. #endif
  467.  
  468. #ifndef dTHR
  469. #  define dTHR dNOOP
  470. #endif
  471.  
  472. #ifndef INIT_THREADS
  473. #  define INIT_THREADS NOOP
  474. #endif
  475.